"""协程也要考虑安全问题"""
import asyncio


class A:
    """协程不安全的示例"""

    def __init__(self):
        self.a = 0
        self.lock = asyncio.Lock()

    async def run(self):
        print(self.a)
        self.a += 1
        await asyncio.sleep(1)
        print('阻塞结束')
        self.a -= 1
        print(self.a)

    async def safe_run(self):
        async with self.lock:
            print(self.a)
            self.a += 1
            await asyncio.sleep(1)
            print('阻塞结束')
            self.a -= 1
            print(self.a)


a = A()

loop = asyncio.get_event_loop()
# loop.run_until_complete(asyncio.gather(a.run(), a.run(), a.run(), a.run()))
loop.run_until_complete(asyncio.gather(a.safe_run(), a.safe_run(), a.safe_run(), a.safe_run()))
